{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "17e88eb4-e863-4640-9ac8-d86450413b15",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "%pylab is deprecated, use %matplotlib inline and import the required libraries.\n",
      "Populating the interactive namespace from numpy and matplotlib\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x27246aaa7b0>]"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%pylab inline \n",
    "import matplotlib.pyplot as plt \n",
    "import numpy as np\n",
    "plt.plot(np.sin(np.linspace(0,2*np.pi, 100)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "5ddfa41e-3cb9-4dcc-a9a6-ce6c03e22da9",
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "os.environ[\"KMP_DUPLICATE_LIB_OK\"]=\"TRUE\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "5c1e5e29-6e44-4bce-8a02-1c3a37aee9a8",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Test set size: 10000\n",
      "Training set size: 50000\n",
      "Number of training samples: 40000\n",
      "Number of cross-validation samples: 10000\n"
     ]
    }
   ],
   "source": [
    "import torch\n",
    "import torchvision\n",
    "import torchvision.transforms as transforms\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "label_size = 18 # Label size\n",
    "ticklabel_size = 14 # Tick label size\n",
    "    \n",
    "# Define a transform to normalize the data\n",
    "transform = transforms.Compose([\n",
    "    transforms.ToTensor()\n",
    "])\n",
    "\n",
    "# Load test data from the MNIST\n",
    "testset = torchvision.datasets.CIFAR10(root='./Data', train=False, download=False, transform=transform)\n",
    "print(f\"Test set size: {len(testset)}\")\n",
    "\n",
    "# Load training data from the MNIST\n",
    "trainset = torchvision.datasets.CIFAR10(root='./Data', train=True, download=False, transform=transform)\n",
    "print(f\"Training set size: {len(trainset)}\")\n",
    "\n",
    "# Rate of trX and cvX\n",
    "tr_cv_rate = 0.8\n",
    "\n",
    "# Create a list to store indices for each class unique()\n",
    "class_indices = [[] for _ in range(10)]  # 10 classes in MNIST\n",
    "\n",
    "# Populate class_indices\n",
    "for idx, (_, label) in enumerate(trainset):\n",
    "    class_indices[label].append(idx)\n",
    "\n",
    "# Calculate the number of samples for each class in training and validation sets\n",
    "train_size_per_class = int(tr_cv_rate * min(len(indices) for indices in class_indices))\n",
    "val_size_per_class = min(len(indices) for indices in class_indices) - train_size_per_class\n",
    "\n",
    "# Create balanced train and validation sets\n",
    "train_indices = []\n",
    "val_indices = []\n",
    "for indices in class_indices:\n",
    "    train_indices.extend(indices[:train_size_per_class])\n",
    "    val_indices.extend(indices[train_size_per_class:train_size_per_class + val_size_per_class])\n",
    "\n",
    "# Create Subset datasets\n",
    "from torch.utils.data import Subset\n",
    "trX = Subset(trainset, train_indices)\n",
    "cvX = Subset(trainset, val_indices)\n",
    "\n",
    "print(f\"Number of training samples: {len(trX)}\")\n",
    "print(f\"Number of cross-validation samples: {len(cvX)}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "e86c53ca-e5aa-4ee4-8aa2-edc9974e8b7a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "image_channels is 3\n",
      "tensor([0., 0., 0., 0., 0., 0., 0., 0., 0., 1.])\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAeEAAAH2CAYAAABHmTQtAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAjJUlEQVR4nO3da5BdBZnu8Wfta+++pDs3knQS0kmDEBKQwYOjqITAHB0uo1WeiEUVXoryaHkpPihSJRZXlfKbfBg5KuUJpXA0FQ/ipUAGBXWmKlOiIyKGW5CGJKQ7SXenu3d37/s6HxxT5oTQm2errwP/XxVfuvrtd629115PrxjzJGmapgIAAH91megDAADgtYoQBgAgCCEMAEAQQhgAgCCEMAAAQQhhAACCEMIAAAQhhAEACEIIAwAQhBDGa96dd96pJEn0y1/+8s/y85Ik0Sc+8Yk/y8/605950003WbO7d+/WTTfdpJGRkT/rMb0SP/3pT5Ukib7zne+EHQPwt4gQBl7ldu/erZtvvjk0hAG8NEIYwDHm5uaiDwF4zSCEgTZUKhV96lOf0tlnn63+/n4tWbJEb37zm/W9733vhDNf/epX9brXvU7FYlFnnHGGvv3tbx/3PaOjo/rIRz6iNWvWqFAoaP369br55pvVaDT+LMd955136j3veY8kaevWrUqSREmS6M4775QkXXDBBdq8ebN+/vOf67zzzlN3d7euuuoqSSf+I/ChoSF98IMfPOZr+/fv14c//GGtXbtWhUJBg4OD2rZtm8bGxk54bNPT03rHO96hFStW6Be/+MWf5XyB/2py0QcA/FdQrVY1MTGha665RqtXr1atVtOPf/xjvfvd79b27dv1/ve//5jv//73v6+HH35Yt9xyi3p6enT77bfriiuuUC6X07Zt2yT9IYDf+MY3KpPJ6IYbbtDw8LB27dqlz3/+8xoZGdH27dtf9piGhoYk6WX/mPnSSy/Vrbfequuuu05f/vKXdc4550iShoeHj37PgQMHdOWVV+raa6/Vrbfeqkzmlf1uvn//fp177rmq1+u67rrrdNZZZ2l8fFwPPPCAJicntWLFiuNm9u3bp0suuUS1Wk27du3Shg0bXtFO4NWCEAba0N/ff0woNptNXXTRRZqcnNRtt912XAgfPnxYjzzyyNEAuuSSS7R582Z95jOfORrCN910kyYnJ/W73/1OJ598siTpoosuUqlU0jXXXKNPf/rTOuOMM054TLncwh/f5cuX69RTT5UknXHGGXrTm9503PdMTExo586duvDCCxf8eS/lhhtu0OHDh/Wb3/xGGzduPPr1yy+//CW//9FHH9Wll16q4eFh3XvvvVqyZIm1F3g14I+jgTbt3LlTb3nLW9Tb26tcLqd8Pq+vf/3reuKJJ4773osuuuiYJ8BsNqv3vve92rNnj/bt2ydJ+uEPf6itW7dqcHBQjUbj6H8XX3yxJOlnP/vZyx7Pnj17tGfPno7Pa/HixXYAS9L999+vrVu3HhPAJ/LAAw/obW97m84//3w9+OCDBDBe8whhoA333HOPLr/8cq1evVp33XWXdu3apUceeURXXXWVKpXKcd+/cuXKE35tfHxckjQ2NqYf/OAHyufzx/y3adMmSX94mv5rWLVqVUfzhw4d0po1a9r63nvvvVfz8/P66Ec/qmKx2NFe4NWAP44G2nDXXXdp/fr12rFjh5IkOfr1arX6kt8/Ojp6wq8tXbpUkrRs2TKdddZZ+sIXvvCSP2NwcLDTw27Ln57PnyoWiy95fn/8JeKPli9ffvTpfiFf+tKXtGPHDl188cX67ne/q7e//e2v/ICBVxFCGGhDkiQqFArHBNbo6OgJ/3b0T37yE42NjR39I+lms6kdO3ZoeHj46FPjZZddpvvuu0/Dw8NavHjxX+zY//jEOT8//4rmhoaG9Nhjjx3ztYceekjlcvmYr1188cX65je/qaeeekqnnXbay/7Mrq4u3XPPPbryyiv1zne+Uzt27NC73vWuV3RcwKsJIQz8p4ceeugl/6bxJZdcossuu0z33HOPPvaxj2nbtm3au3evPve5z2nVqlV65plnjptZtmyZLrzwQl1//fVH/3b0k08+ecz/TemWW27Rgw8+qPPOO09XX321TjvtNFUqFY2MjOi+++7TV77ylZf9Y95TTjlFkhb834U3b94sSfra176mvr4+dXV1af369UefyE/kfe97n66//nrdcMMN2rJli3bv3q1//ud/Vn9//zHfd8stt+j+++/X+eefr+uuu05nnnmmjhw5oh/96Ef65Cc/qdNPP/2Y78/n8/rWt76lD33oQ9q2bZu+8Y1v6IorrnjZYwFetVLgNW779u2ppBP+99xzz6VpmqZf/OIX06GhobRYLKYbN25M77jjjvTG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",
      "text/plain": [
       "<Figure size 600x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "batch_size = 64\n",
    "\n",
    "def one_hot_collate(batch):\n",
    "    data = torch.stack([item[0] for item in batch])\n",
    "    labels = torch.tensor([item[1] for item in batch])\n",
    "    one_hot_labels = torch.zeros(labels.size(0), 10)  # 10 classes in MNIST 【0，1，0，0】\n",
    "    one_hot_labels.scatter_(1, labels.unsqueeze(1), 1)\n",
    "    return data, one_hot_labels\n",
    "\n",
    "trLoader = torch.utils.data.DataLoader(trX, batch_size=batch_size, shuffle=True, num_workers=0, collate_fn=one_hot_collate)\n",
    "cvLoader = torch.utils.data.DataLoader(cvX, batch_size=batch_size, shuffle=False, num_workers=0, collate_fn=one_hot_collate)\n",
    "teLoader = torch.utils.data.DataLoader(testset, batch_size=batch_size, shuffle=False, num_workers=0, collate_fn=one_hot_collate)\n",
    "\n",
    "# Get a batch of training data\n",
    "dataiter = iter(trLoader)\n",
    "data, labels = next(dataiter)\n",
    "\n",
    "image_channels = data[0].numpy().shape[0]\n",
    "print(f'image_channels is {image_channels}')\n",
    "print(labels[0,:])\n",
    "\n",
    "# Label text of CIFAR-10\n",
    "label_text = ['airplane', 'automobile', 'bird', 'cat', 'deer', \n",
    "              'dog', 'frog', 'horse', 'ship', 'truck']\n",
    "\n",
    "# Plot one image from the batch\n",
    "plt.figure(figsize=(6, 6))\n",
    "# Modify the imshow line to handle RGB images correctly\n",
    "plt.imshow(data[0].permute(1, 2, 0).numpy())  # Rearrange from (3,32,32) to (32,32,3)\n",
    "plt.title(f'Label: {label_text[labels[0].argmax().item()]}')\n",
    "plt.axis('off')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "639fe2f8-3b8a-42d4-b75a-6ff76568a2b2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ResNet(\n",
      "  (conv1): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)\n",
      "  (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "  (relu): ReLU(inplace=True)\n",
      "  (maxpool): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)\n",
      "  (layer1): Sequential(\n",
      "    (0): BasicBlock(\n",
      "      (conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "      (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "      (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "      (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "    )\n",
      "    (1): BasicBlock(\n",
      "      (conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "      (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "      (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "      (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "    )\n",
      "  )\n",
      "  (layer2): Sequential(\n",
      "    (0): BasicBlock(\n",
      "      (conv1): Conv2d(64, 128, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n",
      "      (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "      (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "      (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (downsample): Sequential(\n",
      "        (0): Conv2d(64, 128, kernel_size=(1, 1), stride=(2, 2), bias=False)\n",
      "        (1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "    )\n",
      "    (1): BasicBlock(\n",
      "      (conv1): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "      (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "      (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "      (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "    )\n",
      "  )\n",
      "  (layer3): Sequential(\n",
      "    (0): BasicBlock(\n",
      "      (conv1): Conv2d(128, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n",
      "      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "      (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "      (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (downsample): Sequential(\n",
      "        (0): Conv2d(128, 256, kernel_size=(1, 1), stride=(2, 2), bias=False)\n",
      "        (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "    )\n",
      "    (1): BasicBlock(\n",
      "      (conv1): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "      (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "      (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "    )\n",
      "  )\n",
      "  (layer4): Sequential(\n",
      "    (0): BasicBlock(\n",
      "      (conv1): Conv2d(256, 512, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n",
      "      (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "      (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "      (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (downsample): Sequential(\n",
      "        (0): Conv2d(256, 512, kernel_size=(1, 1), stride=(2, 2), bias=False)\n",
      "        (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "    )\n",
      "    (1): BasicBlock(\n",
      "      (conv1): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "      (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "      (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "      (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "    )\n",
      "  )\n",
      "  (avgpool): AdaptiveAvgPool2d(output_size=(1, 1))\n",
      "  (fc): Linear(in_features=512, out_features=1000, bias=True)\n",
      ")\n",
      "ResNet(\n",
      "  (conv1): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
      "  (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "  (relu): ReLU(inplace=True)\n",
      "  (maxpool): Identity()\n",
      "  (layer1): Sequential(\n",
      "    (0): BasicBlock(\n",
      "      (conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "      (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "      (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "      (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "    )\n",
      "    (1): BasicBlock(\n",
      "      (conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "      (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "      (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "      (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "    )\n",
      "  )\n",
      "  (layer2): Sequential(\n",
      "    (0): BasicBlock(\n",
      "      (conv1): Conv2d(64, 128, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n",
      "      (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "      (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "      (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (downsample): Sequential(\n",
      "        (0): Conv2d(64, 128, kernel_size=(1, 1), stride=(2, 2), bias=False)\n",
      "        (1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "    )\n",
      "    (1): BasicBlock(\n",
      "      (conv1): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "      (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "      (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "      (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "    )\n",
      "  )\n",
      "  (layer3): Sequential(\n",
      "    (0): BasicBlock(\n",
      "      (conv1): Conv2d(128, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n",
      "      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "      (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "      (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (downsample): Sequential(\n",
      "        (0): Conv2d(128, 256, kernel_size=(1, 1), stride=(2, 2), bias=False)\n",
      "        (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "    )\n",
      "    (1): BasicBlock(\n",
      "      (conv1): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "      (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "      (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "      (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "    )\n",
      "  )\n",
      "  (layer4): Sequential(\n",
      "    (0): BasicBlock(\n",
      "      (conv1): Conv2d(256, 512, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n",
      "      (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "      (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "      (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (downsample): Sequential(\n",
      "        (0): Conv2d(256, 512, kernel_size=(1, 1), stride=(2, 2), bias=False)\n",
      "        (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      )\n",
      "    )\n",
      "    (1): BasicBlock(\n",
      "      (conv1): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "      (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "      (relu): ReLU(inplace=True)\n",
      "      (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n",
      "      (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
      "    )\n",
      "  )\n",
      "  (avgpool): AdaptiveAvgPool2d(output_size=(1, 1))\n",
      "  (fc): Linear(in_features=512, out_features=10, bias=True)\n",
      ")\n"
     ]
    }
   ],
   "source": [
    "import torch.nn as nn\n",
    "import torchvision.models as models\n",
    "# 1. 加载预训练模型\n",
    "model = torchvision.models.resnet18(weights=models.ResNet18_Weights.IMAGENET1K_V1)\n",
    "print(model)\n",
    "# 2. 修改输入层 (因为 MNIST 是单通道图像)\n",
    "model.conv1 = nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1)\n",
    "\n",
    "# 3. 移除第一层Maxpooling避免参数过早消失\n",
    "model.maxpool = nn.Identity() # nn.Conv2d(64, 64, 1, 1, 1)\n",
    "\n",
    "# 4. 修改输出层 (根据任务的类别数)\n",
    "model.fc = nn.Linear(model.fc.in_features, 10)  # 10为MNIST的类别数\n",
    "\n",
    "# 打印模型结构\n",
    "print(model)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "062cb759-96f9-4b4f-a08e-7a5b79ef6960",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/2, Training Loss: 2.5113\n",
      "Epoch 1/2, Training Loss: 2.1687\n",
      "Epoch 1/2, Training Loss: 2.1065\n",
      "Epoch 1/2, Training Loss: 2.1917\n",
      "Epoch 1/2, Training Loss: 2.2275\n",
      "Epoch 1/2, Training Loss: 2.0928\n",
      "Epoch 1/2, Training Loss: 1.9604\n",
      "Epoch 1/2, Training Loss: 1.3546\n",
      "Epoch 1/2, Training Loss: 2.2083\n",
      "Epoch 1/2, Training Loss: 1.8326\n",
      "Epoch 1/2, Training Loss: 2.0969\n",
      "Epoch 1/2, Training Loss: 1.6357\n",
      "Epoch 1/2, Training Loss: 1.6704\n",
      "Epoch 1/2, Training Loss: 1.5637\n",
      "Epoch 1/2, Training Loss: 1.8271\n",
      "Epoch 1/2, Training Loss: 1.7631\n",
      "Epoch 1/2, Training Loss: 1.8183\n",
      "Epoch 1/2, Training Loss: 1.7576\n",
      "Epoch 1/2, Training Loss: 1.7451\n",
      "Epoch 1/2, Training Loss: 1.7492\n",
      "Epoch 1/2, Training Loss: 1.6114\n",
      "Epoch 1/2, Training Loss: 1.7017\n",
      "Epoch 1/2, Training Loss: 1.9054\n",
      "Epoch 1/2, Training Loss: 1.5295\n",
      "Epoch 1/2, Training Loss: 1.5161\n",
      "Epoch 1/2, Training Loss: 1.4513\n",
      "Epoch 1/2, Training Loss: 1.7125\n",
      "Epoch 1/2, Training Loss: 1.3977\n",
      "Epoch 1/2, Training Loss: 1.4147\n",
      "Epoch 1/2, Training Loss: 1.5007\n",
      "Epoch 1/2, Training Loss: 1.6478\n",
      "Epoch 1/2, Training Loss: 1.3389\n",
      "Epoch 1/2, Training Loss: 1.3705\n",
      "Epoch 1/2, Training Loss: 1.4922\n",
      "Epoch 1/2, Training Loss: 1.2567\n",
      "Epoch 1/2, Training Loss: 1.3985\n",
      "Epoch 1/2, Training Loss: 1.4203\n",
      "Epoch 1/2, Training Loss: 1.2388\n",
      "Epoch 1/2, Training Loss: 1.5211\n",
      "Epoch 1/2, Training Loss: 1.2899\n",
      "Epoch 1/2, Training Loss: 1.4253\n",
      "Epoch 1/2, Training Loss: 1.1761\n",
      "Epoch 1/2, Training Loss: 1.1698\n",
      "Epoch 1/2, Training Loss: 1.1383\n",
      "Epoch 1/2, Training Loss: 1.2913\n",
      "Epoch 1/2, Training Loss: 1.1942\n",
      "Epoch 1/2, Training Loss: 1.3229\n",
      "Epoch 1/2, Training Loss: 1.3397\n",
      "Epoch 1/2, Training Loss: 1.0062\n",
      "Epoch 1/2, Training Loss: 1.2298\n",
      "Epoch 1/2, Training Loss: 1.4541\n",
      "Epoch 1/2, Training Loss: 1.3622\n",
      "Epoch 1/2, Training Loss: 1.1579\n",
      "Epoch 1/2, Training Loss: 1.1095\n",
      "Epoch 1/2, Training Loss: 1.0568\n",
      "Epoch 1/2, Training Loss: 1.3038\n",
      "Epoch 1/2, Training Loss: 1.3552\n",
      "Epoch 1/2, Training Loss: 1.2999\n",
      "Epoch 1/2, Training Loss: 1.1499\n",
      "Epoch 1/2, Training Loss: 0.9668\n",
      "Epoch 1/2, Training Loss: 1.1076\n",
      "Epoch 1/2, Training Loss: 1.2517\n",
      "Epoch 1/2, Training Loss: 1.2854\n",
      "Epoch 1/2, Training Loss: 1.1745\n",
      "Epoch 1/2, Training Loss: 1.2448\n",
      "Epoch 1/2, Training Loss: 1.1920\n",
      "Epoch 1/2, Training Loss: 1.1762\n",
      "Epoch 1/2, Training Loss: 1.0607\n",
      "Epoch 1/2, Training Loss: 1.0001\n",
      "Epoch 1/2, Training Loss: 1.2652\n",
      "Epoch 1/2, Training Loss: 1.0105\n",
      "Epoch 1/2, Training Loss: 1.2808\n",
      "Epoch 1/2, Training Loss: 1.1421\n",
      "Epoch 1/2, Training Loss: 0.9852\n",
      "Epoch 1/2, Training Loss: 0.9741\n",
      "Epoch 1/2, Training Loss: 1.2802\n",
      "Epoch 1/2, Training Loss: 1.4742\n",
      "Epoch 1/2, Training Loss: 1.0192\n",
      "Epoch 1/2, Training Loss: 1.0879\n",
      "Epoch 1/2, Training Loss: 1.0903\n",
      "Epoch 1/2, Training Loss: 0.9181\n",
      "Epoch 1/2, Training Loss: 1.0248\n",
      "Epoch 1/2, Training Loss: 1.2877\n",
      "Epoch 1/2, Training Loss: 0.8926\n",
      "Epoch 1/2, Training Loss: 0.8303\n",
      "Epoch 1/2, Training Loss: 0.9655\n",
      "Epoch 1/2, Training Loss: 1.0893\n",
      "Epoch 1/2, Training Loss: 1.1068\n",
      "Epoch 1/2, Training Loss: 0.9122\n",
      "Epoch 1/2, Training Loss: 1.1665\n",
      "Epoch 1/2, Training Loss: 1.0392\n",
      "Epoch 1/2, Training Loss: 1.0084\n",
      "Epoch 1/2, Training Loss: 0.9238\n",
      "Epoch 1/2, Training Loss: 0.9229\n",
      "Epoch 1/2, Training Loss: 1.0689\n",
      "Epoch 1/2, Training Loss: 1.2454\n",
      "Epoch 1/2, Training Loss: 0.8225\n",
      "Epoch 1/2, Training Loss: 1.0918\n",
      "Epoch 1/2, Training Loss: 1.1275\n",
      "Epoch 1/2, Training Loss: 0.9084\n",
      "Epoch 1/2, Training Loss: 1.0443\n",
      "Epoch 1/2, Training Loss: 0.9876\n",
      "Epoch 1/2, Training Loss: 0.9852\n",
      "Epoch 1/2, Training Loss: 0.8533\n",
      "Epoch 1/2, Training Loss: 1.1888\n",
      "Epoch 1/2, Training Loss: 1.1691\n",
      "Epoch 1/2, Training Loss: 0.7938\n",
      "Epoch 1/2, Training Loss: 0.5931\n",
      "Epoch 1/2, Training Loss: 1.0112\n",
      "Epoch 1/2, Training Loss: 1.1354\n",
      "Epoch 1/2, Training Loss: 1.1080\n",
      "Epoch 1/2, Training Loss: 1.2025\n",
      "Epoch 1/2, Training Loss: 1.0607\n",
      "Epoch 1/2, Training Loss: 1.1002\n",
      "Epoch 1/2, Training Loss: 0.8851\n",
      "Epoch 1/2, Training Loss: 0.6325\n",
      "Epoch 1/2, Training Loss: 1.0775\n",
      "Epoch 1/2, Training Loss: 1.0350\n",
      "Epoch 1/2, Training Loss: 0.7816\n",
      "Epoch 1/2, Training Loss: 0.7520\n",
      "Epoch 1/2, Training Loss: 1.1255\n",
      "Epoch 1/2, Training Loss: 0.7157\n",
      "Epoch 1/2, Training Loss: 1.0485\n",
      "Epoch 1/2, Training Loss: 0.8498\n",
      "Epoch 1/2, Training Loss: 1.0688\n",
      "Epoch 1/2, Training Loss: 0.8105\n",
      "Epoch 1/2, Training Loss: 0.7615\n",
      "Epoch 1/2, Training Loss: 0.6883\n",
      "Epoch 1/2, Training Loss: 0.7886\n",
      "Epoch 1/2, Training Loss: 0.8475\n",
      "Epoch 1/2, Training Loss: 0.8529\n",
      "Epoch 1/2, Training Loss: 0.9975\n",
      "Epoch 1/2, Training Loss: 0.7561\n",
      "Epoch 1/2, Training Loss: 0.9429\n",
      "Epoch 1/2, Training Loss: 1.1785\n",
      "Epoch 1/2, Training Loss: 0.9180\n",
      "Epoch 1/2, Training Loss: 1.0875\n",
      "Epoch 1/2, Training Loss: 1.3073\n",
      "Epoch 1/2, Training Loss: 0.8508\n",
      "Epoch 1/2, Training Loss: 0.7446\n",
      "Epoch 1/2, Training Loss: 1.0107\n",
      "Epoch 1/2, Training Loss: 0.9387\n",
      "Epoch 1/2, Training Loss: 0.9766\n",
      "Epoch 1/2, Training Loss: 0.7997\n",
      "Epoch 1/2, Training Loss: 1.1668\n",
      "Epoch 1/2, Training Loss: 0.8215\n",
      "Epoch 1/2, Training Loss: 0.8241\n",
      "Epoch 1/2, Training Loss: 0.6198\n",
      "Epoch 1/2, Training Loss: 0.9444\n",
      "Epoch 1/2, Training Loss: 0.8842\n",
      "Epoch 1/2, Training Loss: 0.5725\n",
      "Epoch 1/2, Training Loss: 1.0253\n",
      "Epoch 1/2, Training Loss: 1.0540\n",
      "Epoch 1/2, Training Loss: 0.8526\n",
      "Epoch 1/2, Training Loss: 0.9670\n",
      "Epoch 1/2, Training Loss: 0.8446\n",
      "Epoch 1/2, Training Loss: 0.7487\n",
      "Epoch 1/2, Training Loss: 1.0318\n",
      "Epoch 1/2, Training Loss: 1.0892\n",
      "Epoch 1/2, Training Loss: 1.0685\n",
      "Epoch 1/2, Training Loss: 0.7622\n",
      "Epoch 1/2, Training Loss: 1.1779\n",
      "Epoch 1/2, Training Loss: 0.7398\n",
      "Epoch 1/2, Training Loss: 0.8867\n",
      "Epoch 1/2, Training Loss: 0.9180\n",
      "Epoch 1/2, Training Loss: 0.6352\n",
      "Epoch 1/2, Training Loss: 0.8019\n",
      "Epoch 1/2, Training Loss: 0.9035\n",
      "Epoch 1/2, Training Loss: 0.8088\n",
      "Epoch 1/2, Training Loss: 1.4778\n",
      "Epoch 1/2, Training Loss: 1.0866\n",
      "Epoch 1/2, Training Loss: 0.8452\n",
      "Epoch 1/2, Training Loss: 0.8149\n",
      "Epoch 1/2, Training Loss: 0.8274\n",
      "Epoch 1/2, Training Loss: 0.8856\n",
      "Epoch 1/2, Training Loss: 0.9461\n",
      "Epoch 1/2, Training Loss: 0.7604\n",
      "Epoch 1/2, Training Loss: 0.9259\n",
      "Epoch 1/2, Training Loss: 1.0137\n",
      "Epoch 1/2, Training Loss: 0.8842\n",
      "Epoch 1/2, Training Loss: 0.8618\n",
      "Epoch 1/2, Training Loss: 0.5872\n",
      "Epoch 1/2, Training Loss: 0.9833\n",
      "Epoch 1/2, Training Loss: 0.9186\n",
      "Epoch 1/2, Training Loss: 0.6913\n",
      "Epoch 1/2, Training Loss: 0.9393\n",
      "Epoch 1/2, Training Loss: 0.7505\n",
      "Epoch 1/2, Training Loss: 0.9476\n",
      "Epoch 1/2, Training Loss: 0.9795\n",
      "Epoch 1/2, Training Loss: 1.2615\n",
      "Epoch 1/2, Training Loss: 0.7445\n",
      "Epoch 1/2, Training Loss: 0.7042\n",
      "Epoch 1/2, Training Loss: 0.6133\n",
      "Epoch 1/2, Training Loss: 0.6432\n",
      "Epoch 1/2, Training Loss: 0.8084\n",
      "Epoch 1/2, Training Loss: 0.7128\n",
      "Epoch 1/2, Training Loss: 0.8017\n",
      "Epoch 1/2, Training Loss: 0.9910\n",
      "Epoch 1/2, Training Loss: 0.7739\n",
      "Epoch 1/2, Training Loss: 0.8744\n",
      "Epoch 1/2, Training Loss: 1.0810\n",
      "Epoch 1/2, Training Loss: 0.6865\n",
      "Epoch 1/2, Training Loss: 0.7325\n",
      "Epoch 1/2, Training Loss: 0.6682\n",
      "Epoch 1/2, Training Loss: 1.0339\n",
      "Epoch 1/2, Training Loss: 0.9082\n",
      "Epoch 1/2, Training Loss: 0.7922\n",
      "Epoch 1/2, Training Loss: 0.8245\n",
      "Epoch 1/2, Training Loss: 0.8543\n",
      "Epoch 1/2, Training Loss: 0.9473\n",
      "Epoch 1/2, Training Loss: 0.6552\n",
      "Epoch 1/2, Training Loss: 0.9590\n",
      "Epoch 1/2, Training Loss: 0.7120\n",
      "Epoch 1/2, Training Loss: 0.7016\n",
      "Epoch 1/2, Training Loss: 0.7669\n",
      "Epoch 1/2, Training Loss: 0.8014\n",
      "Epoch 1/2, Training Loss: 0.7027\n",
      "Epoch 1/2, Training Loss: 0.7665\n",
      "Epoch 1/2, Training Loss: 0.9978\n",
      "Epoch 1/2, Training Loss: 0.7171\n",
      "Epoch 1/2, Training Loss: 0.7728\n",
      "Epoch 1/2, Training Loss: 0.9445\n",
      "Epoch 1/2, Training Loss: 1.1858\n",
      "Epoch 1/2, Training Loss: 0.7692\n",
      "Epoch 1/2, Training Loss: 0.6182\n",
      "Epoch 1/2, Training Loss: 0.6994\n",
      "Epoch 1/2, Training Loss: 0.6033\n",
      "Epoch 1/2, Training Loss: 0.7561\n",
      "Epoch 1/2, Training Loss: 0.8989\n",
      "Epoch 1/2, Training Loss: 0.9383\n",
      "Epoch 1/2, Training Loss: 0.8372\n",
      "Epoch 1/2, Training Loss: 0.7623\n",
      "Epoch 1/2, Training Loss: 0.8030\n",
      "Epoch 1/2, Training Loss: 1.1056\n",
      "Epoch 1/2, Training Loss: 0.6580\n",
      "Epoch 1/2, Training Loss: 0.7809\n",
      "Epoch 1/2, Training Loss: 0.6209\n",
      "Epoch 1/2, Training Loss: 0.7843\n",
      "Epoch 1/2, Training Loss: 0.9704\n",
      "Epoch 1/2, Training Loss: 1.0960\n",
      "Epoch 1/2, Training Loss: 0.9302\n",
      "Epoch 1/2, Training Loss: 0.7479\n",
      "Epoch 1/2, Training Loss: 0.8569\n",
      "Epoch 1/2, Training Loss: 0.5841\n",
      "Epoch 1/2, Training Loss: 0.7006\n",
      "Epoch 1/2, Training Loss: 0.6653\n",
      "Epoch 1/2, Training Loss: 0.9128\n",
      "Epoch 1/2, Training Loss: 0.7228\n",
      "Epoch 1/2, Training Loss: 0.6338\n",
      "Epoch 1/2, Training Loss: 0.6354\n",
      "Epoch 1/2, Training Loss: 0.7706\n",
      "Epoch 1/2, Training Loss: 0.8094\n",
      "Epoch 1/2, Training Loss: 0.6840\n",
      "Epoch 1/2, Training Loss: 0.8923\n",
      "Epoch 1/2, Training Loss: 0.8332\n",
      "Epoch 1/2, Training Loss: 0.8122\n",
      "Epoch 1/2, Training Loss: 0.9884\n",
      "Epoch 1/2, Training Loss: 0.7230\n",
      "Epoch 1/2, Training Loss: 0.6364\n",
      "Epoch 1/2, Training Loss: 0.8647\n",
      "Epoch 1/2, Training Loss: 0.8149\n",
      "Epoch 1/2, Training Loss: 0.7615\n",
      "Epoch 1/2, Training Loss: 1.0265\n",
      "Epoch 1/2, Training Loss: 0.7232\n",
      "Epoch 1/2, Training Loss: 0.5976\n",
      "Epoch 1/2, Training Loss: 0.9692\n",
      "Epoch 1/2, Training Loss: 0.7841\n",
      "Epoch 1/2, Training Loss: 0.5027\n",
      "Epoch 1/2, Training Loss: 1.0242\n",
      "Epoch 1/2, Training Loss: 0.5778\n",
      "Epoch 1/2, Training Loss: 0.7482\n",
      "Epoch 1/2, Training Loss: 0.7105\n",
      "Epoch 1/2, Training Loss: 0.5085\n",
      "Epoch 1/2, Training Loss: 0.6380\n",
      "Epoch 1/2, Training Loss: 0.6491\n",
      "Epoch 1/2, Training Loss: 0.7382\n",
      "Epoch 1/2, Training Loss: 0.5634\n",
      "Epoch 1/2, Training Loss: 0.6674\n",
      "Epoch 1/2, Training Loss: 0.8193\n",
      "Epoch 1/2, Training Loss: 0.6180\n",
      "Epoch 1/2, Training Loss: 0.8513\n",
      "Epoch 1/2, Training Loss: 0.6798\n",
      "Epoch 1/2, Training Loss: 0.7243\n",
      "Epoch 1/2, Training Loss: 0.6256\n",
      "Epoch 1/2, Training Loss: 0.7698\n",
      "Epoch 1/2, Training Loss: 0.6171\n",
      "Epoch 1/2, Training Loss: 0.5068\n",
      "Epoch 1/2, Training Loss: 0.8718\n",
      "Epoch 1/2, Training Loss: 0.8497\n",
      "Epoch 1/2, Training Loss: 0.7240\n",
      "Epoch 1/2, Training Loss: 0.6485\n",
      "Epoch 1/2, Training Loss: 0.9181\n",
      "Epoch 1/2, Training Loss: 0.5781\n",
      "Epoch 1/2, Training Loss: 0.5749\n",
      "Epoch 1/2, Training Loss: 0.6387\n",
      "Epoch 1/2, Training Loss: 0.7283\n",
      "Epoch 1/2, Training Loss: 0.6711\n",
      "Epoch 1/2, Training Loss: 1.0266\n",
      "Epoch 1/2, Training Loss: 0.9540\n",
      "Epoch 1/2, Training Loss: 0.6438\n",
      "Epoch 1/2, Training Loss: 0.7589\n",
      "Epoch 1/2, Training Loss: 0.7105\n",
      "Epoch 1/2, Training Loss: 0.8748\n",
      "Epoch 1/2, Training Loss: 0.5575\n",
      "Epoch 1/2, Training Loss: 0.8706\n",
      "Epoch 1/2, Training Loss: 0.5777\n",
      "Epoch 1/2, Training Loss: 0.7736\n",
      "Epoch 1/2, Training Loss: 0.5370\n",
      "Epoch 1/2, Training Loss: 0.7003\n",
      "Epoch 1/2, Training Loss: 0.7544\n",
      "Epoch 1/2, Training Loss: 0.6164\n",
      "Epoch 1/2, Training Loss: 0.5924\n",
      "Epoch 1/2, Training Loss: 0.8658\n",
      "Epoch 1/2, Training Loss: 0.6806\n",
      "Epoch 1/2, Training Loss: 0.6726\n",
      "Epoch 1/2, Training Loss: 0.4918\n",
      "Epoch 1/2, Training Loss: 0.7158\n",
      "Epoch 1/2, Training Loss: 0.7954\n",
      "Epoch 1/2, Training Loss: 0.7791\n",
      "Epoch 1/2, Training Loss: 0.6241\n",
      "Epoch 1/2, Training Loss: 0.8873\n",
      "Epoch 1/2, Training Loss: 0.6665\n",
      "Epoch 1/2, Training Loss: 0.8452\n",
      "Epoch 1/2, Training Loss: 0.5203\n",
      "Epoch 1/2, Training Loss: 0.8997\n",
      "Epoch 1/2, Training Loss: 0.7239\n",
      "Epoch 1/2, Training Loss: 0.7188\n",
      "Epoch 1/2, Training Loss: 0.5128\n",
      "Epoch 1/2, Training Loss: 0.5740\n",
      "Epoch 1/2, Training Loss: 0.6368\n",
      "Epoch 1/2, Training Loss: 0.7008\n",
      "Epoch 1/2, Training Loss: 0.7044\n",
      "Epoch 1/2, Training Loss: 0.6686\n",
      "Epoch 1/2, Training Loss: 0.6043\n",
      "Epoch 1/2, Training Loss: 0.9094\n",
      "Epoch 1/2, Training Loss: 0.7011\n",
      "Epoch 1/2, Training Loss: 0.6709\n",
      "Epoch 1/2, Training Loss: 0.7246\n",
      "Epoch 1/2, Training Loss: 0.8334\n",
      "Epoch 1/2, Training Loss: 0.7032\n",
      "Epoch 1/2, Training Loss: 0.8979\n",
      "Epoch 1/2, Training Loss: 0.7457\n",
      "Epoch 1/2, Training Loss: 0.5851\n",
      "Epoch 1/2, Training Loss: 0.6983\n",
      "Epoch 1/2, Training Loss: 0.8588\n",
      "Epoch 1/2, Training Loss: 0.5269\n",
      "Epoch 1/2, Training Loss: 0.8698\n",
      "Epoch 1/2, Training Loss: 0.8018\n",
      "Epoch 1/2, Training Loss: 0.6181\n",
      "Epoch 1/2, Training Loss: 0.6858\n",
      "Epoch 1/2, Training Loss: 0.8365\n",
      "Epoch 1/2, Training Loss: 0.5792\n",
      "Epoch 1/2, Training Loss: 0.6580\n",
      "Epoch 1/2, Training Loss: 0.5402\n",
      "Epoch 1/2, Training Loss: 0.5521\n",
      "Epoch 1/2, Training Loss: 0.8327\n",
      "Epoch 1/2, Training Loss: 0.5300\n",
      "Epoch 1/2, Training Loss: 0.9899\n",
      "Epoch 1/2, Training Loss: 0.7139\n",
      "Epoch 1/2, Training Loss: 0.7434\n",
      "Epoch 1/2, Training Loss: 0.8032\n",
      "Epoch 1/2, Training Loss: 0.7656\n",
      "Epoch 1/2, Training Loss: 0.7339\n",
      "Epoch 1/2, Training Loss: 0.9188\n",
      "Epoch 1/2, Training Loss: 0.6335\n",
      "Epoch 1/2, Training Loss: 0.9135\n",
      "Epoch 1/2, Training Loss: 0.6381\n",
      "Epoch 1/2, Training Loss: 0.8051\n",
      "Epoch 1/2, Training Loss: 0.6754\n",
      "Epoch 1/2, Training Loss: 0.5917\n",
      "Epoch 1/2, Training Loss: 0.9676\n",
      "Epoch 1/2, Training Loss: 0.5091\n",
      "Epoch 1/2, Training Loss: 0.6490\n",
      "Epoch 1/2, Training Loss: 0.9205\n",
      "Epoch 1/2, Training Loss: 0.6702\n",
      "Epoch 1/2, Training Loss: 0.7743\n",
      "Epoch 1/2, Training Loss: 0.7853\n",
      "Epoch 1/2, Training Loss: 0.7676\n",
      "Epoch 1/2, Training Loss: 0.7252\n",
      "Epoch 1/2, Training Loss: 0.7320\n",
      "Epoch 1/2, Training Loss: 0.7399\n",
      "Epoch 1/2, Training Loss: 0.6996\n",
      "Epoch 1/2, Training Loss: 0.6128\n",
      "Epoch 1/2, Training Loss: 0.6772\n",
      "Epoch 1/2, Training Loss: 0.5994\n",
      "Epoch 1/2, Training Loss: 0.6575\n",
      "Epoch 1/2, Training Loss: 0.6476\n",
      "Epoch 1/2, Training Loss: 0.7601\n",
      "Epoch 1/2, Training Loss: 0.5390\n",
      "Epoch 1/2, Training Loss: 0.4081\n",
      "Epoch 1/2, Training Loss: 0.5974\n",
      "Epoch 1/2, Training Loss: 0.6255\n",
      "Epoch 1/2, Training Loss: 0.8004\n",
      "Epoch 1/2, Training Loss: 0.4897\n",
      "Epoch 1/2, Training Loss: 0.8973\n",
      "Epoch 1/2, Training Loss: 0.8791\n",
      "Epoch 1/2, Training Loss: 0.7089\n",
      "Epoch 1/2, Training Loss: 0.8430\n",
      "Epoch 1/2, Training Loss: 0.7262\n",
      "Epoch 1/2, Training Loss: 0.6976\n",
      "Epoch 1/2, Training Loss: 0.7035\n",
      "Epoch 1/2, Training Loss: 0.5072\n",
      "Epoch 1/2, Training Loss: 0.6018\n",
      "Epoch 1/2, Training Loss: 0.6802\n",
      "Epoch 1/2, Training Loss: 0.4739\n",
      "Epoch 1/2, Training Loss: 0.7064\n",
      "Epoch 1/2, Training Loss: 0.6636\n",
      "Epoch 1/2, Training Loss: 0.6187\n",
      "Epoch 1/2, Training Loss: 0.8897\n",
      "Epoch 1/2, Training Loss: 0.5997\n",
      "Epoch 1/2, Training Loss: 0.7742\n",
      "Epoch 1/2, Training Loss: 0.5971\n",
      "Epoch 1/2, Training Loss: 0.4742\n",
      "Epoch 1/2, Training Loss: 0.6319\n",
      "Epoch 1/2, Training Loss: 0.7144\n",
      "Epoch 1/2, Training Loss: 0.6213\n",
      "Epoch 1/2, Training Loss: 0.7418\n",
      "Epoch 1/2, Training Loss: 0.7494\n",
      "Epoch 1/2, Training Loss: 0.8168\n",
      "Epoch 1/2, Training Loss: 0.8831\n",
      "Epoch 1/2, Training Loss: 0.9846\n",
      "Epoch 1/2, Training Loss: 0.5293\n",
      "Epoch 1/2, Training Loss: 0.6439\n",
      "Epoch 1/2, Training Loss: 0.7540\n",
      "Epoch 1/2, Training Loss: 0.5617\n",
      "Epoch 1/2, Training Loss: 0.6565\n",
      "Epoch 1/2, Training Loss: 0.5704\n",
      "Epoch 1/2, Training Loss: 0.7090\n",
      "Epoch 1/2, Training Loss: 0.4640\n",
      "Epoch 1/2, Training Loss: 0.4055\n",
      "Epoch 1/2, Training Loss: 0.5567\n",
      "Epoch 1/2, Training Loss: 0.6854\n",
      "Epoch 1/2, Training Loss: 0.5288\n",
      "Epoch 1/2, Training Loss: 0.4843\n",
      "Epoch 1/2, Training Loss: 0.5433\n",
      "Epoch 1/2, Training Loss: 0.7039\n",
      "Epoch 1/2, Training Loss: 0.5847\n",
      "Epoch 1/2, Training Loss: 0.6818\n",
      "Epoch 1/2, Training Loss: 0.5530\n",
      "Epoch 1/2, Training Loss: 0.5173\n",
      "Epoch 1/2, Training Loss: 0.8260\n",
      "Epoch 1/2, Training Loss: 0.6214\n",
      "Epoch 1/2, Training Loss: 0.6669\n",
      "Epoch 1/2, Training Loss: 0.3981\n",
      "Epoch 1/2, Training Loss: 0.6302\n",
      "Epoch 1/2, Training Loss: 0.5175\n",
      "Epoch 1/2, Training Loss: 0.5167\n",
      "Epoch 1/2, Training Loss: 0.7511\n",
      "Epoch 1/2, Training Loss: 0.6018\n",
      "Epoch 1/2, Training Loss: 0.6477\n",
      "Epoch 1/2, Training Loss: 0.8099\n",
      "Epoch 1/2, Training Loss: 0.5712\n",
      "Epoch 1/2, Training Loss: 0.7034\n",
      "Epoch 1/2, Training Loss: 0.8056\n",
      "Epoch 1/2, Training Loss: 0.6837\n",
      "Epoch 1/2, Training Loss: 0.7505\n",
      "Epoch 1/2, Training Loss: 0.8554\n",
      "Epoch 1/2, Training Loss: 0.5930\n",
      "Epoch 1/2, Training Loss: 0.6022\n",
      "Epoch 1/2, Training Loss: 0.5588\n",
      "Epoch 1/2, Training Loss: 0.8621\n",
      "Epoch 1/2, Training Loss: 0.7519\n",
      "Epoch 1/2, Training Loss: 0.5768\n",
      "Epoch 1/2, Training Loss: 0.6549\n",
      "Epoch 1/2, Training Loss: 0.5056\n",
      "Epoch 1/2, Training Loss: 0.6052\n",
      "Epoch 1/2, Training Loss: 0.4009\n",
      "Epoch 1/2, Training Loss: 0.5100\n",
      "Epoch 1/2, Training Loss: 0.6071\n",
      "Epoch 1/2, Training Loss: 0.5880\n",
      "Epoch 1/2, Training Loss: 0.7960\n",
      "Epoch 1/2, Training Loss: 0.7611\n",
      "Epoch 1/2, Training Loss: 0.6580\n",
      "Epoch 1/2, Training Loss: 0.6224\n",
      "Epoch 1/2, Training Loss: 0.5258\n",
      "Epoch 1/2, Training Loss: 0.8309\n",
      "Epoch 1/2, Training Loss: 0.4768\n",
      "Epoch 1/2, Training Loss: 0.6414\n",
      "Epoch 1/2, Training Loss: 0.4498\n",
      "Epoch 1/2, Training Loss: 0.5342\n",
      "Epoch 1/2, Training Loss: 0.8019\n",
      "Epoch 1/2, Training Loss: 0.5570\n",
      "Epoch 1/2, Training Loss: 0.4158\n",
      "Epoch 1/2, Training Loss: 0.4604\n",
      "Epoch 1/2, Training Loss: 0.7406\n",
      "Epoch 1/2, Training Loss: 0.4876\n",
      "Epoch 1/2, Training Loss: 0.4738\n",
      "Epoch 1/2, Training Loss: 0.5403\n",
      "Epoch 1/2, Training Loss: 0.5225\n",
      "Epoch 1/2, Training Loss: 0.6885\n",
      "Epoch 1/2, Training Loss: 0.6408\n",
      "Epoch 1/2, Training Loss: 0.6816\n",
      "Epoch 1/2, Training Loss: 0.6501\n",
      "Epoch 1/2, Training Loss: 0.4828\n",
      "Epoch 1/2, Training Loss: 0.6378\n",
      "Epoch 1/2, Training Loss: 0.7278\n",
      "Epoch 1/2, Training Loss: 0.7008\n",
      "Epoch 1/2, Training Loss: 0.6152\n",
      "Epoch 1/2, Training Loss: 0.6162\n",
      "Epoch 1/2, Training Loss: 0.4574\n",
      "Epoch 1/2, Training Loss: 0.4544\n",
      "Epoch 1/2, Training Loss: 0.6854\n",
      "Epoch 1/2, Training Loss: 0.7129\n",
      "Epoch 1/2, Training Loss: 0.5121\n",
      "Epoch 1/2, Training Loss: 0.6103\n",
      "Epoch 1/2, Training Loss: 0.4430\n",
      "Epoch 1/2, Training Loss: 0.5920\n",
      "Epoch 1/2, Training Loss: 0.6919\n",
      "Epoch 1/2, Training Loss: 0.3952\n",
      "Epoch 1/2, Training Loss: 0.6615\n",
      "Epoch 1/2, Training Loss: 0.6849\n",
      "Epoch 1/2, Training Loss: 0.4145\n",
      "Epoch 1/2, Training Loss: 0.7919\n",
      "Epoch 1/2, Training Loss: 0.5326\n",
      "Epoch 1/2, Training Loss: 0.4696\n",
      "Epoch 1/2, Training Loss: 0.6341\n",
      "Epoch 1/2, Training Loss: 0.4829\n",
      "Epoch 1/2, Training Loss: 0.8041\n",
      "Epoch 1/2, Training Loss: 0.7734\n",
      "Epoch 1/2, Training Loss: 0.5013\n",
      "Epoch 1/2, Training Loss: 0.5757\n",
      "Epoch 1/2, Training Loss: 0.3707\n",
      "Epoch 1/2, Training Loss: 0.4901\n",
      "Epoch 1/2, Training Loss: 0.8260\n",
      "Epoch 1/2, Training Loss: 0.7505\n",
      "Epoch 1/2, Training Loss: 0.6894\n",
      "Epoch 1/2, Training Loss: 0.6124\n",
      "Epoch 1/2, Training Loss: 0.8637\n",
      "Epoch 1/2, Training Loss: 0.7662\n",
      "Epoch 1/2, Training Loss: 0.5838\n",
      "Epoch 1/2, Training Loss: 0.5975\n",
      "Epoch 1/2, Training Loss: 0.8950\n",
      "Epoch 1/2, Training Loss: 0.5024\n",
      "Epoch 1/2, Training Loss: 0.3961\n",
      "Epoch 1/2, Training Loss: 0.5547\n",
      "Epoch 1/2, Training Loss: 0.4915\n",
      "Epoch 1/2, Training Loss: 0.7351\n",
      "Epoch 1/2, Training Loss: 0.6672\n",
      "Epoch 1/2, Training Loss: 0.6078\n",
      "Epoch 1/2, Training Loss: 0.3885\n",
      "Epoch 1/2, Training Loss: 0.3748\n",
      "Epoch 1/2, Training Loss: 0.5536\n",
      "Epoch 1/2, Training Loss: 0.4869\n",
      "Epoch 1/2, Training Loss: 0.6075\n",
      "Epoch 1/2, Training Loss: 0.7793\n",
      "Epoch 1/2, Training Loss: 0.7145\n",
      "Epoch 1/2, Training Loss: 0.6610\n",
      "Epoch 1/2, Training Loss: 0.4940\n",
      "Epoch 1/2, Training Loss: 0.5030\n",
      "Epoch 1/2, Training Loss: 0.6107\n",
      "Epoch 1/2, Training Loss: 0.8302\n",
      "Epoch 1/2, Training Loss: 0.5196\n",
      "Epoch 1/2, Training Loss: 0.5390\n",
      "Epoch 1/2, Training Loss: 0.8726\n",
      "Epoch 1/2, Training Loss: 0.6893\n",
      "Epoch 1/2, Training Loss: 0.7651\n",
      "Epoch 1/2, Training Loss: 0.6130\n",
      "Epoch 1/2, Training Loss: 0.5907\n",
      "Epoch 1/2, Training Loss: 0.6757\n",
      "Epoch 1/2, Training Loss: 0.5081\n",
      "Epoch 1/2, Training Loss: 0.6595\n",
      "Epoch 1/2, Training Loss: 0.6667\n",
      "Epoch 1/2, Training Loss: 0.7841\n",
      "Epoch 1/2, Training Loss: 0.6116\n",
      "Epoch 1/2, Training Loss: 0.7855\n",
      "Epoch 1/2, Training Loss: 0.3792\n",
      "Epoch 1/2, Training Loss: 0.8009\n",
      "Epoch 1/2, Training Loss: 0.9099\n",
      "Epoch 1/2, Training Loss: 0.8505\n",
      "Epoch 1/2, Training Loss: 0.4884\n",
      "Epoch 1/2, Training Loss: 0.7412\n",
      "Epoch 1/2, Training Loss: 0.4550\n",
      "Epoch 1/2, Training Loss: 1.0466\n",
      "Epoch 1/2, Training Loss: 0.5304\n",
      "Epoch 1/2, Training Loss: 0.6539\n",
      "Epoch 1/2, Training Loss: 0.6316\n",
      "Epoch 1/2, Training Loss: 0.8746\n",
      "Epoch 1/2, Training Loss: 0.5708\n",
      "Epoch 1/2, Training Loss: 0.4992\n",
      "Epoch 1/2, Training Loss: 0.7080\n",
      "Epoch 1/2, Training Loss: 0.6303\n",
      "Epoch 1/2, Training Loss: 0.5608\n",
      "Epoch 1/2, Training Loss: 0.8273\n",
      "Epoch 1/2, Training Loss: 0.5399\n",
      "Epoch 1/2, Training Loss: 0.6907\n",
      "Epoch 1/2, Training Loss: 1.1329\n",
      "Epoch 1/2, Training Loss: 0.4985\n",
      "Epoch 1/2, Training Loss: 0.6330\n",
      "Epoch 1/2, Training Loss: 0.4356\n",
      "Epoch 1/2, Training Loss: 0.7200\n",
      "Epoch 1/2, Training Loss: 0.7115\n",
      "Epoch 1/2, Training Loss: 0.4883\n",
      "Epoch 1/2, Training Loss: 0.7197\n",
      "Epoch 1/2, Training Loss: 0.6702\n",
      "Epoch 1/2, Training Loss: 0.7813\n",
      "Epoch 1/2, Training Loss: 0.6540\n",
      "Epoch 1/2, Training Loss: 0.5645\n",
      "Epoch 1/2, Training Loss: 0.6267\n",
      "Epoch 1/2, Training Loss: 0.3616\n",
      "Epoch 1/2, Training Loss: 0.7438\n",
      "Epoch 1/2, Training Loss: 0.5591\n",
      "Epoch 1/2, Training Loss: 0.5551\n",
      "Epoch 1/2, Training Loss: 0.6402\n",
      "Epoch 1/2, Training Loss: 0.7134\n",
      "Epoch 1/2, Training Loss: 0.3372\n",
      "Epoch 1/2, Training Loss: 0.5732\n",
      "Epoch 1/2, Training Loss: 0.5618\n",
      "Epoch 1/2, Training Loss: 0.6509\n",
      "Epoch 1/2, Training Loss: 0.6735\n",
      "Epoch 1/2, Training Loss: 0.5250\n",
      "Epoch 1/2, Training Loss: 0.4809\n",
      "Epoch 1/2, Training Loss: 0.6356\n",
      "Epoch 1/2, Training Loss: 0.4727\n",
      "Epoch 1/2, Training Loss: 0.6563\n",
      "Epoch 1/2, Training Loss: 0.7095\n",
      "Epoch 1/2, Training Loss: 0.4743\n",
      "Epoch 1/2, Training Loss: 0.7049\n",
      "Epoch 1/2, Training Loss: 0.7370\n",
      "Epoch 1/2, Training Loss: 0.5845\n",
      "Epoch 1/2, Training Loss: 0.6069\n",
      "Epoch 1/2, Training Loss: 0.5203\n",
      "Epoch 1/2, Training Loss: 0.5163\n",
      "Epoch 1/2, Training Loss: 0.5533\n",
      "Epoch 1/2, Training Loss: 0.5069\n",
      "Epoch 1/2, Training Loss: 0.4745\n",
      "Epoch 1/2, Training Loss: 0.4745, Cross-Validation Loss: 0.5568\n",
      "Epoch 2/2, Training Loss: 0.5338\n",
      "Epoch 2/2, Training Loss: 0.5381\n",
      "Epoch 2/2, Training Loss: 0.5618\n",
      "Epoch 2/2, Training Loss: 0.3897\n",
      "Epoch 2/2, Training Loss: 0.4157\n",
      "Epoch 2/2, Training Loss: 0.3783\n",
      "Epoch 2/2, Training Loss: 0.5037\n",
      "Epoch 2/2, Training Loss: 0.5061\n",
      "Epoch 2/2, Training Loss: 0.4019\n",
      "Epoch 2/2, Training Loss: 0.8919\n",
      "Epoch 2/2, Training Loss: 0.4322\n",
      "Epoch 2/2, Training Loss: 0.4411\n",
      "Epoch 2/2, Training Loss: 0.3669\n",
      "Epoch 2/2, Training Loss: 0.5552\n",
      "Epoch 2/2, Training Loss: 0.6231\n",
      "Epoch 2/2, Training Loss: 0.7223\n",
      "Epoch 2/2, Training Loss: 0.4938\n",
      "Epoch 2/2, Training Loss: 0.4834\n",
      "Epoch 2/2, Training Loss: 0.4803\n",
      "Epoch 2/2, Training Loss: 0.2699\n",
      "Epoch 2/2, Training Loss: 0.3207\n",
      "Epoch 2/2, Training Loss: 0.4677\n",
      "Epoch 2/2, Training Loss: 0.4559\n",
      "Epoch 2/2, Training Loss: 0.4926\n",
      "Epoch 2/2, Training Loss: 0.4445\n",
      "Epoch 2/2, Training Loss: 0.4576\n",
      "Epoch 2/2, Training Loss: 0.5348\n",
      "Epoch 2/2, Training Loss: 0.3425\n",
      "Epoch 2/2, Training Loss: 0.4514\n",
      "Epoch 2/2, Training Loss: 0.2013\n",
      "Epoch 2/2, Training Loss: 0.3940\n",
      "Epoch 2/2, Training Loss: 0.7541\n",
      "Epoch 2/2, Training Loss: 0.3579\n",
      "Epoch 2/2, Training Loss: 0.6024\n",
      "Epoch 2/2, Training Loss: 0.3141\n",
      "Epoch 2/2, Training Loss: 0.4256\n",
      "Epoch 2/2, Training Loss: 0.4611\n",
      "Epoch 2/2, Training Loss: 0.3771\n",
      "Epoch 2/2, Training Loss: 0.4110\n",
      "Epoch 2/2, Training Loss: 0.5277\n",
      "Epoch 2/2, Training Loss: 0.5300\n",
      "Epoch 2/2, Training Loss: 0.4788\n",
      "Epoch 2/2, Training Loss: 0.5956\n",
      "Epoch 2/2, Training Loss: 0.3769\n",
      "Epoch 2/2, Training Loss: 0.4805\n",
      "Epoch 2/2, Training Loss: 0.4039\n",
      "Epoch 2/2, Training Loss: 0.3050\n",
      "Epoch 2/2, Training Loss: 0.5425\n",
      "Epoch 2/2, Training Loss: 0.3475\n",
      "Epoch 2/2, Training Loss: 0.3959\n",
      "Epoch 2/2, Training Loss: 0.6557\n",
      "Epoch 2/2, Training Loss: 0.6888\n",
      "Epoch 2/2, Training Loss: 0.3696\n",
      "Epoch 2/2, Training Loss: 0.4756\n",
      "Epoch 2/2, Training Loss: 0.2812\n",
      "Epoch 2/2, Training Loss: 0.4536\n",
      "Epoch 2/2, Training Loss: 0.3265\n",
      "Epoch 2/2, Training Loss: 0.3338\n",
      "Epoch 2/2, Training Loss: 0.3559\n",
      "Epoch 2/2, Training Loss: 0.4786\n",
      "Epoch 2/2, Training Loss: 1.0595\n",
      "Epoch 2/2, Training Loss: 0.2659\n",
      "Epoch 2/2, Training Loss: 0.3928\n",
      "Epoch 2/2, Training Loss: 0.6361\n",
      "Epoch 2/2, Training Loss: 0.3968\n",
      "Epoch 2/2, Training Loss: 0.7432\n",
      "Epoch 2/2, Training Loss: 0.4521\n",
      "Epoch 2/2, Training Loss: 0.4800\n",
      "Epoch 2/2, Training Loss: 0.2769\n",
      "Epoch 2/2, Training Loss: 0.4895\n",
      "Epoch 2/2, Training Loss: 0.4089\n",
      "Epoch 2/2, Training Loss: 0.3610\n",
      "Epoch 2/2, Training Loss: 0.6721\n",
      "Epoch 2/2, Training Loss: 0.5636\n",
      "Epoch 2/2, Training Loss: 0.4923\n",
      "Epoch 2/2, Training Loss: 0.5688\n",
      "Epoch 2/2, Training Loss: 0.3259\n",
      "Epoch 2/2, Training Loss: 0.5387\n",
      "Epoch 2/2, Training Loss: 0.3874\n",
      "Epoch 2/2, Training Loss: 0.6125\n",
      "Epoch 2/2, Training Loss: 0.3935\n",
      "Epoch 2/2, Training Loss: 0.7722\n",
      "Epoch 2/2, Training Loss: 0.3895\n",
      "Epoch 2/2, Training Loss: 0.4940\n",
      "Epoch 2/2, Training Loss: 0.4012\n",
      "Epoch 2/2, Training Loss: 0.4234\n",
      "Epoch 2/2, Training Loss: 0.4951\n",
      "Epoch 2/2, Training Loss: 0.3891\n",
      "Epoch 2/2, Training Loss: 0.5345\n",
      "Epoch 2/2, Training Loss: 0.5952\n",
      "Epoch 2/2, Training Loss: 0.4351\n",
      "Epoch 2/2, Training Loss: 0.3150\n",
      "Epoch 2/2, Training Loss: 0.4992\n",
      "Epoch 2/2, Training Loss: 0.2313\n",
      "Epoch 2/2, Training Loss: 0.6048\n",
      "Epoch 2/2, Training Loss: 0.4972\n",
      "Epoch 2/2, Training Loss: 0.6133\n",
      "Epoch 2/2, Training Loss: 0.4341\n",
      "Epoch 2/2, Training Loss: 0.4748\n",
      "Epoch 2/2, Training Loss: 0.2915\n",
      "Epoch 2/2, Training Loss: 0.5601\n",
      "Epoch 2/2, Training Loss: 0.4599\n",
      "Epoch 2/2, Training Loss: 0.5826\n",
      "Epoch 2/2, Training Loss: 0.5271\n",
      "Epoch 2/2, Training Loss: 0.3955\n",
      "Epoch 2/2, Training Loss: 0.2950\n",
      "Epoch 2/2, Training Loss: 0.3604\n",
      "Epoch 2/2, Training Loss: 0.4439\n",
      "Epoch 2/2, Training Loss: 0.6673\n",
      "Epoch 2/2, Training Loss: 0.4809\n",
      "Epoch 2/2, Training Loss: 0.3960\n",
      "Epoch 2/2, Training Loss: 0.5010\n",
      "Epoch 2/2, Training Loss: 0.3727\n",
      "Epoch 2/2, Training Loss: 0.5737\n",
      "Epoch 2/2, Training Loss: 0.2760\n",
      "Epoch 2/2, Training Loss: 0.4872\n",
      "Epoch 2/2, Training Loss: 0.3168\n",
      "Epoch 2/2, Training Loss: 0.3937\n",
      "Epoch 2/2, Training Loss: 0.4615\n",
      "Epoch 2/2, Training Loss: 0.6551\n",
      "Epoch 2/2, Training Loss: 0.4933\n",
      "Epoch 2/2, Training Loss: 0.3895\n",
      "Epoch 2/2, Training Loss: 0.6367\n",
      "Epoch 2/2, Training Loss: 0.5840\n",
      "Epoch 2/2, Training Loss: 0.5073\n",
      "Epoch 2/2, Training Loss: 0.3810\n",
      "Epoch 2/2, Training Loss: 0.4958\n",
      "Epoch 2/2, Training Loss: 0.3716\n",
      "Epoch 2/2, Training Loss: 0.3436\n",
      "Epoch 2/2, Training Loss: 0.2752\n",
      "Epoch 2/2, Training Loss: 0.3893\n",
      "Epoch 2/2, Training Loss: 0.2948\n",
      "Epoch 2/2, Training Loss: 0.3246\n",
      "Epoch 2/2, Training Loss: 0.3403\n",
      "Epoch 2/2, Training Loss: 0.3922\n",
      "Epoch 2/2, Training Loss: 0.4066\n",
      "Epoch 2/2, Training Loss: 0.7900\n",
      "Epoch 2/2, Training Loss: 0.5196\n",
      "Epoch 2/2, Training Loss: 0.5528\n",
      "Epoch 2/2, Training Loss: 0.4022\n",
      "Epoch 2/2, Training Loss: 0.5598\n",
      "Epoch 2/2, Training Loss: 0.3396\n",
      "Epoch 2/2, Training Loss: 0.4775\n",
      "Epoch 2/2, Training Loss: 0.3361\n",
      "Epoch 2/2, Training Loss: 0.4681\n",
      "Epoch 2/2, Training Loss: 0.3818\n",
      "Epoch 2/2, Training Loss: 0.5045\n",
      "Epoch 2/2, Training Loss: 0.3197\n",
      "Epoch 2/2, Training Loss: 0.6831\n",
      "Epoch 2/2, Training Loss: 0.5672\n",
      "Epoch 2/2, Training Loss: 0.2295\n",
      "Epoch 2/2, Training Loss: 0.3519\n",
      "Epoch 2/2, Training Loss: 0.6507\n",
      "Epoch 2/2, Training Loss: 0.3586\n",
      "Epoch 2/2, Training Loss: 0.5434\n",
      "Epoch 2/2, Training Loss: 0.4356\n",
      "Epoch 2/2, Training Loss: 0.3821\n",
      "Epoch 2/2, Training Loss: 0.2710\n",
      "Epoch 2/2, Training Loss: 0.5489\n",
      "Epoch 2/2, Training Loss: 0.4056\n",
      "Epoch 2/2, Training Loss: 0.4149\n",
      "Epoch 2/2, Training Loss: 0.4649\n",
      "Epoch 2/2, Training Loss: 0.4547\n",
      "Epoch 2/2, Training Loss: 0.6294\n",
      "Epoch 2/2, Training Loss: 0.3427\n",
      "Epoch 2/2, Training Loss: 0.4066\n",
      "Epoch 2/2, Training Loss: 0.5564\n",
      "Epoch 2/2, Training Loss: 0.5270\n",
      "Epoch 2/2, Training Loss: 0.5569\n",
      "Epoch 2/2, Training Loss: 0.3454\n",
      "Epoch 2/2, Training Loss: 0.5496\n",
      "Epoch 2/2, Training Loss: 0.5585\n",
      "Epoch 2/2, Training Loss: 0.4446\n",
      "Epoch 2/2, Training Loss: 0.6044\n",
      "Epoch 2/2, Training Loss: 0.2958\n",
      "Epoch 2/2, Training Loss: 0.4451\n",
      "Epoch 2/2, Training Loss: 0.5497\n",
      "Epoch 2/2, Training Loss: 0.2728\n",
      "Epoch 2/2, Training Loss: 0.5146\n",
      "Epoch 2/2, Training Loss: 0.3348\n",
      "Epoch 2/2, Training Loss: 0.5214\n",
      "Epoch 2/2, Training Loss: 0.5382\n",
      "Epoch 2/2, Training Loss: 0.4060\n",
      "Epoch 2/2, Training Loss: 0.6934\n",
      "Epoch 2/2, Training Loss: 0.6035\n",
      "Epoch 2/2, Training Loss: 0.5706\n",
      "Epoch 2/2, Training Loss: 0.4119\n",
      "Epoch 2/2, Training Loss: 0.4643\n",
      "Epoch 2/2, Training Loss: 0.5942\n",
      "Epoch 2/2, Training Loss: 0.4472\n",
      "Epoch 2/2, Training Loss: 0.5143\n",
      "Epoch 2/2, Training Loss: 0.4689\n",
      "Epoch 2/2, Training Loss: 0.5901\n",
      "Epoch 2/2, Training Loss: 0.4081\n",
      "Epoch 2/2, Training Loss: 0.3563\n",
      "Epoch 2/2, Training Loss: 0.5079\n",
      "Epoch 2/2, Training Loss: 0.4865\n",
      "Epoch 2/2, Training Loss: 0.4617\n",
      "Epoch 2/2, Training Loss: 0.6107\n",
      "Epoch 2/2, Training Loss: 0.4127\n",
      "Epoch 2/2, Training Loss: 0.3843\n",
      "Epoch 2/2, Training Loss: 0.3784\n",
      "Epoch 2/2, Training Loss: 0.4304\n",
      "Epoch 2/2, Training Loss: 0.5510\n",
      "Epoch 2/2, Training Loss: 0.4307\n",
      "Epoch 2/2, Training Loss: 0.5375\n",
      "Epoch 2/2, Training Loss: 0.4754\n",
      "Epoch 2/2, Training Loss: 0.4677\n",
      "Epoch 2/2, Training Loss: 0.3778\n",
      "Epoch 2/2, Training Loss: 0.4202\n",
      "Epoch 2/2, Training Loss: 0.2452\n",
      "Epoch 2/2, Training Loss: 0.3934\n",
      "Epoch 2/2, Training Loss: 0.5732\n",
      "Epoch 2/2, Training Loss: 0.4755\n",
      "Epoch 2/2, Training Loss: 0.3670\n",
      "Epoch 2/2, Training Loss: 0.4311\n",
      "Epoch 2/2, Training Loss: 0.4304\n",
      "Epoch 2/2, Training Loss: 0.3623\n",
      "Epoch 2/2, Training Loss: 0.2702\n",
      "Epoch 2/2, Training Loss: 0.3095\n",
      "Epoch 2/2, Training Loss: 0.5199\n",
      "Epoch 2/2, Training Loss: 0.5107\n",
      "Epoch 2/2, Training Loss: 0.4516\n",
      "Epoch 2/2, Training Loss: 0.4545\n",
      "Epoch 2/2, Training Loss: 0.5436\n",
      "Epoch 2/2, Training Loss: 0.3661\n",
      "Epoch 2/2, Training Loss: 0.4064\n",
      "Epoch 2/2, Training Loss: 0.5336\n",
      "Epoch 2/2, Training Loss: 0.7019\n",
      "Epoch 2/2, Training Loss: 0.3643\n",
      "Epoch 2/2, Training Loss: 0.2299\n",
      "Epoch 2/2, Training Loss: 0.4189\n",
      "Epoch 2/2, Training Loss: 0.3567\n",
      "Epoch 2/2, Training Loss: 0.2910\n",
      "Epoch 2/2, Training Loss: 0.5181\n",
      "Epoch 2/2, Training Loss: 0.6571\n",
      "Epoch 2/2, Training Loss: 0.5007\n",
      "Epoch 2/2, Training Loss: 0.6205\n",
      "Epoch 2/2, Training Loss: 0.3161\n",
      "Epoch 2/2, Training Loss: 0.4249\n",
      "Epoch 2/2, Training Loss: 0.5227\n",
      "Epoch 2/2, Training Loss: 0.3208\n",
      "Epoch 2/2, Training Loss: 0.3920\n",
      "Epoch 2/2, Training Loss: 0.4658\n",
      "Epoch 2/2, Training Loss: 0.5003\n",
      "Epoch 2/2, Training Loss: 0.6892\n",
      "Epoch 2/2, Training Loss: 0.4768\n",
      "Epoch 2/2, Training Loss: 0.3759\n",
      "Epoch 2/2, Training Loss: 0.5440\n",
      "Epoch 2/2, Training Loss: 0.4333\n",
      "Epoch 2/2, Training Loss: 0.6189\n",
      "Epoch 2/2, Training Loss: 0.6096\n",
      "Epoch 2/2, Training Loss: 0.4474\n",
      "Epoch 2/2, Training Loss: 0.4062\n",
      "Epoch 2/2, Training Loss: 0.5797\n",
      "Epoch 2/2, Training Loss: 0.3951\n",
      "Epoch 2/2, Training Loss: 0.4123\n",
      "Epoch 2/2, Training Loss: 0.4493\n",
      "Epoch 2/2, Training Loss: 0.8141\n",
      "Epoch 2/2, Training Loss: 0.3170\n",
      "Epoch 2/2, Training Loss: 0.3395\n",
      "Epoch 2/2, Training Loss: 0.4671\n",
      "Epoch 2/2, Training Loss: 0.6024\n",
      "Epoch 2/2, Training Loss: 0.4012\n",
      "Epoch 2/2, Training Loss: 0.4265\n",
      "Epoch 2/2, Training Loss: 0.5009\n",
      "Epoch 2/2, Training Loss: 0.5066\n",
      "Epoch 2/2, Training Loss: 0.4337\n",
      "Epoch 2/2, Training Loss: 0.4519\n",
      "Epoch 2/2, Training Loss: 0.4590\n",
      "Epoch 2/2, Training Loss: 0.4609\n",
      "Epoch 2/2, Training Loss: 0.3689\n",
      "Epoch 2/2, Training Loss: 0.5682\n",
      "Epoch 2/2, Training Loss: 0.4412\n",
      "Epoch 2/2, Training Loss: 0.3223\n",
      "Epoch 2/2, Training Loss: 0.4011\n",
      "Epoch 2/2, Training Loss: 0.4626\n",
      "Epoch 2/2, Training Loss: 0.3037\n",
      "Epoch 2/2, Training Loss: 0.4297\n",
      "Epoch 2/2, Training Loss: 0.4663\n",
      "Epoch 2/2, Training Loss: 0.5935\n",
      "Epoch 2/2, Training Loss: 0.6636\n",
      "Epoch 2/2, Training Loss: 0.4694\n",
      "Epoch 2/2, Training Loss: 0.4691\n",
      "Epoch 2/2, Training Loss: 0.4880\n",
      "Epoch 2/2, Training Loss: 0.4935\n",
      "Epoch 2/2, Training Loss: 0.4450\n",
      "Epoch 2/2, Training Loss: 0.3869\n",
      "Epoch 2/2, Training Loss: 0.4501\n",
      "Epoch 2/2, Training Loss: 0.5509\n",
      "Epoch 2/2, Training Loss: 0.4648\n",
      "Epoch 2/2, Training Loss: 0.6827\n",
      "Epoch 2/2, Training Loss: 0.2890\n",
      "Epoch 2/2, Training Loss: 0.7190\n",
      "Epoch 2/2, Training Loss: 0.4974\n",
      "Epoch 2/2, Training Loss: 0.3580\n",
      "Epoch 2/2, Training Loss: 0.5836\n",
      "Epoch 2/2, Training Loss: 0.3715\n",
      "Epoch 2/2, Training Loss: 0.5763\n",
      "Epoch 2/2, Training Loss: 0.4105\n",
      "Epoch 2/2, Training Loss: 0.7208\n",
      "Epoch 2/2, Training Loss: 0.2829\n",
      "Epoch 2/2, Training Loss: 0.4579\n",
      "Epoch 2/2, Training Loss: 0.7287\n",
      "Epoch 2/2, Training Loss: 0.4664\n",
      "Epoch 2/2, Training Loss: 0.3649\n",
      "Epoch 2/2, Training Loss: 0.4681\n",
      "Epoch 2/2, Training Loss: 0.4522\n",
      "Epoch 2/2, Training Loss: 0.3846\n",
      "Epoch 2/2, Training Loss: 0.4256\n",
      "Epoch 2/2, Training Loss: 0.3037\n",
      "Epoch 2/2, Training Loss: 0.4781\n",
      "Epoch 2/2, Training Loss: 0.9046\n",
      "Epoch 2/2, Training Loss: 0.4406\n",
      "Epoch 2/2, Training Loss: 0.4294\n",
      "Epoch 2/2, Training Loss: 0.6745\n",
      "Epoch 2/2, Training Loss: 0.5172\n",
      "Epoch 2/2, Training Loss: 0.4824\n",
      "Epoch 2/2, Training Loss: 0.5882\n",
      "Epoch 2/2, Training Loss: 0.5285\n",
      "Epoch 2/2, Training Loss: 0.6787\n",
      "Epoch 2/2, Training Loss: 0.5183\n",
      "Epoch 2/2, Training Loss: 0.7793\n",
      "Epoch 2/2, Training Loss: 0.6981\n",
      "Epoch 2/2, Training Loss: 0.4624\n",
      "Epoch 2/2, Training Loss: 0.4346\n",
      "Epoch 2/2, Training Loss: 0.7354\n",
      "Epoch 2/2, Training Loss: 0.5529\n",
      "Epoch 2/2, Training Loss: 0.4099\n",
      "Epoch 2/2, Training Loss: 0.5161\n",
      "Epoch 2/2, Training Loss: 0.7719\n",
      "Epoch 2/2, Training Loss: 0.4500\n",
      "Epoch 2/2, Training Loss: 0.3710\n",
      "Epoch 2/2, Training Loss: 0.4952\n",
      "Epoch 2/2, Training Loss: 0.6894\n",
      "Epoch 2/2, Training Loss: 0.4377\n",
      "Epoch 2/2, Training Loss: 0.6270\n",
      "Epoch 2/2, Training Loss: 0.2562\n",
      "Epoch 2/2, Training Loss: 0.3512\n",
      "Epoch 2/2, Training Loss: 0.4028\n",
      "Epoch 2/2, Training Loss: 0.5031\n",
      "Epoch 2/2, Training Loss: 0.4421\n",
      "Epoch 2/2, Training Loss: 0.3150\n",
      "Epoch 2/2, Training Loss: 0.6511\n",
      "Epoch 2/2, Training Loss: 0.4227\n",
      "Epoch 2/2, Training Loss: 0.5174\n",
      "Epoch 2/2, Training Loss: 0.4856\n",
      "Epoch 2/2, Training Loss: 0.5589\n",
      "Epoch 2/2, Training Loss: 0.4363\n",
      "Epoch 2/2, Training Loss: 0.5406\n",
      "Epoch 2/2, Training Loss: 0.5250\n",
      "Epoch 2/2, Training Loss: 0.4478\n",
      "Epoch 2/2, Training Loss: 0.5638\n",
      "Epoch 2/2, Training Loss: 0.5899\n",
      "Epoch 2/2, Training Loss: 0.4305\n",
      "Epoch 2/2, Training Loss: 0.4533\n",
      "Epoch 2/2, Training Loss: 0.3408\n",
      "Epoch 2/2, Training Loss: 0.5287\n",
      "Epoch 2/2, Training Loss: 0.3451\n",
      "Epoch 2/2, Training Loss: 0.5797\n",
      "Epoch 2/2, Training Loss: 0.6646\n",
      "Epoch 2/2, Training Loss: 0.4399\n",
      "Epoch 2/2, Training Loss: 0.4047\n",
      "Epoch 2/2, Training Loss: 0.4043\n",
      "Epoch 2/2, Training Loss: 0.2805\n",
      "Epoch 2/2, Training Loss: 0.3740\n",
      "Epoch 2/2, Training Loss: 0.5404\n",
      "Epoch 2/2, Training Loss: 0.5173\n",
      "Epoch 2/2, Training Loss: 0.3487\n",
      "Epoch 2/2, Training Loss: 0.4341\n",
      "Epoch 2/2, Training Loss: 0.5607\n",
      "Epoch 2/2, Training Loss: 0.3586\n",
      "Epoch 2/2, Training Loss: 0.4380\n",
      "Epoch 2/2, Training Loss: 0.2371\n",
      "Epoch 2/2, Training Loss: 0.4250\n",
      "Epoch 2/2, Training Loss: 0.5725\n",
      "Epoch 2/2, Training Loss: 0.5519\n",
      "Epoch 2/2, Training Loss: 0.5977\n",
      "Epoch 2/2, Training Loss: 0.6513\n",
      "Epoch 2/2, Training Loss: 0.4631\n",
      "Epoch 2/2, Training Loss: 0.3882\n",
      "Epoch 2/2, Training Loss: 0.6321\n",
      "Epoch 2/2, Training Loss: 0.4805\n",
      "Epoch 2/2, Training Loss: 0.3073\n",
      "Epoch 2/2, Training Loss: 0.5539\n",
      "Epoch 2/2, Training Loss: 0.7307\n",
      "Epoch 2/2, Training Loss: 0.6116\n",
      "Epoch 2/2, Training Loss: 0.5988\n",
      "Epoch 2/2, Training Loss: 0.7205\n",
      "Epoch 2/2, Training Loss: 0.5122\n",
      "Epoch 2/2, Training Loss: 0.5483\n",
      "Epoch 2/2, Training Loss: 0.4676\n",
      "Epoch 2/2, Training Loss: 0.5377\n",
      "Epoch 2/2, Training Loss: 0.2952\n",
      "Epoch 2/2, Training Loss: 0.3445\n",
      "Epoch 2/2, Training Loss: 0.4499\n",
      "Epoch 2/2, Training Loss: 0.3818\n",
      "Epoch 2/2, Training Loss: 0.6961\n",
      "Epoch 2/2, Training Loss: 0.6260\n",
      "Epoch 2/2, Training Loss: 0.4261\n",
      "Epoch 2/2, Training Loss: 0.3805\n",
      "Epoch 2/2, Training Loss: 0.6990\n",
      "Epoch 2/2, Training Loss: 0.4826\n",
      "Epoch 2/2, Training Loss: 0.3791\n",
      "Epoch 2/2, Training Loss: 0.3939\n",
      "Epoch 2/2, Training Loss: 0.4968\n",
      "Epoch 2/2, Training Loss: 0.3326\n",
      "Epoch 2/2, Training Loss: 0.3639\n",
      "Epoch 2/2, Training Loss: 0.3066\n",
      "Epoch 2/2, Training Loss: 0.4545\n",
      "Epoch 2/2, Training Loss: 0.2874\n",
      "Epoch 2/2, Training Loss: 0.4312\n",
      "Epoch 2/2, Training Loss: 0.4110\n",
      "Epoch 2/2, Training Loss: 0.4403\n",
      "Epoch 2/2, Training Loss: 0.3993\n",
      "Epoch 2/2, Training Loss: 0.7090\n",
      "Epoch 2/2, Training Loss: 0.5227\n",
      "Epoch 2/2, Training Loss: 0.3084\n",
      "Epoch 2/2, Training Loss: 0.3906\n",
      "Epoch 2/2, Training Loss: 0.4183\n",
      "Epoch 2/2, Training Loss: 0.6461\n",
      "Epoch 2/2, Training Loss: 0.4858\n",
      "Epoch 2/2, Training Loss: 0.5645\n",
      "Epoch 2/2, Training Loss: 0.3840\n",
      "Epoch 2/2, Training Loss: 0.4173\n",
      "Epoch 2/2, Training Loss: 0.3391\n",
      "Epoch 2/2, Training Loss: 0.3861\n",
      "Epoch 2/2, Training Loss: 0.3054\n",
      "Epoch 2/2, Training Loss: 0.3896\n",
      "Epoch 2/2, Training Loss: 0.5644\n",
      "Epoch 2/2, Training Loss: 0.5087\n",
      "Epoch 2/2, Training Loss: 0.3576\n",
      "Epoch 2/2, Training Loss: 0.3955\n",
      "Epoch 2/2, Training Loss: 0.2479\n",
      "Epoch 2/2, Training Loss: 0.4036\n",
      "Epoch 2/2, Training Loss: 0.5777\n",
      "Epoch 2/2, Training Loss: 0.6624\n",
      "Epoch 2/2, Training Loss: 0.4708\n",
      "Epoch 2/2, Training Loss: 0.3645\n",
      "Epoch 2/2, Training Loss: 0.2570\n",
      "Epoch 2/2, Training Loss: 0.6132\n",
      "Epoch 2/2, Training Loss: 0.3399\n",
      "Epoch 2/2, Training Loss: 0.3345\n",
      "Epoch 2/2, Training Loss: 0.4597\n",
      "Epoch 2/2, Training Loss: 0.3762\n",
      "Epoch 2/2, Training Loss: 0.3481\n",
      "Epoch 2/2, Training Loss: 0.3048\n",
      "Epoch 2/2, Training Loss: 0.3043\n",
      "Epoch 2/2, Training Loss: 0.4356\n",
      "Epoch 2/2, Training Loss: 0.4109\n",
      "Epoch 2/2, Training Loss: 0.3987\n",
      "Epoch 2/2, Training Loss: 0.5550\n",
      "Epoch 2/2, Training Loss: 0.5079\n",
      "Epoch 2/2, Training Loss: 0.3430\n",
      "Epoch 2/2, Training Loss: 0.3494\n",
      "Epoch 2/2, Training Loss: 0.3924\n",
      "Epoch 2/2, Training Loss: 0.3750\n",
      "Epoch 2/2, Training Loss: 0.2450\n",
      "Epoch 2/2, Training Loss: 0.5231\n",
      "Epoch 2/2, Training Loss: 0.5473\n",
      "Epoch 2/2, Training Loss: 0.6403\n",
      "Epoch 2/2, Training Loss: 0.4083\n",
      "Epoch 2/2, Training Loss: 0.4133\n",
      "Epoch 2/2, Training Loss: 0.3824\n",
      "Epoch 2/2, Training Loss: 0.5275\n",
      "Epoch 2/2, Training Loss: 0.4057\n",
      "Epoch 2/2, Training Loss: 0.3641\n",
      "Epoch 2/2, Training Loss: 0.3530\n",
      "Epoch 2/2, Training Loss: 0.6229\n",
      "Epoch 2/2, Training Loss: 0.2810\n",
      "Epoch 2/2, Training Loss: 0.3027\n",
      "Epoch 2/2, Training Loss: 0.4448\n",
      "Epoch 2/2, Training Loss: 0.4488\n",
      "Epoch 2/2, Training Loss: 0.3318\n",
      "Epoch 2/2, Training Loss: 0.6834\n",
      "Epoch 2/2, Training Loss: 0.2822\n",
      "Epoch 2/2, Training Loss: 0.4581\n",
      "Epoch 2/2, Training Loss: 0.5799\n",
      "Epoch 2/2, Training Loss: 0.5790\n",
      "Epoch 2/2, Training Loss: 0.5609\n",
      "Epoch 2/2, Training Loss: 0.5132\n",
      "Epoch 2/2, Training Loss: 0.5035\n",
      "Epoch 2/2, Training Loss: 0.5465\n",
      "Epoch 2/2, Training Loss: 0.5201\n",
      "Epoch 2/2, Training Loss: 0.5041\n",
      "Epoch 2/2, Training Loss: 0.6410\n",
      "Epoch 2/2, Training Loss: 0.4756\n",
      "Epoch 2/2, Training Loss: 0.7397\n",
      "Epoch 2/2, Training Loss: 0.4084\n",
      "Epoch 2/2, Training Loss: 0.7362\n",
      "Epoch 2/2, Training Loss: 0.3218\n",
      "Epoch 2/2, Training Loss: 0.5532\n",
      "Epoch 2/2, Training Loss: 0.6203\n",
      "Epoch 2/2, Training Loss: 0.4852\n",
      "Epoch 2/2, Training Loss: 0.5208\n",
      "Epoch 2/2, Training Loss: 0.3709\n",
      "Epoch 2/2, Training Loss: 0.2834\n",
      "Epoch 2/2, Training Loss: 0.4910\n",
      "Epoch 2/2, Training Loss: 0.4261\n",
      "Epoch 2/2, Training Loss: 0.5977\n",
      "Epoch 2/2, Training Loss: 0.5153\n",
      "Epoch 2/2, Training Loss: 0.4593\n",
      "Epoch 2/2, Training Loss: 0.3194\n",
      "Epoch 2/2, Training Loss: 0.4848\n",
      "Epoch 2/2, Training Loss: 0.5215\n",
      "Epoch 2/2, Training Loss: 0.6024\n",
      "Epoch 2/2, Training Loss: 0.2341\n",
      "Epoch 2/2, Training Loss: 0.4671\n",
      "Epoch 2/2, Training Loss: 0.4669\n",
      "Epoch 2/2, Training Loss: 0.2154\n",
      "Epoch 2/2, Training Loss: 0.6549\n",
      "Epoch 2/2, Training Loss: 0.3884\n",
      "Epoch 2/2, Training Loss: 0.2969\n",
      "Epoch 2/2, Training Loss: 0.4231\n",
      "Epoch 2/2, Training Loss: 0.4358\n",
      "Epoch 2/2, Training Loss: 0.2864\n",
      "Epoch 2/2, Training Loss: 0.2915\n",
      "Epoch 2/2, Training Loss: 0.5960\n",
      "Epoch 2/2, Training Loss: 0.4217\n",
      "Epoch 2/2, Training Loss: 0.4366\n",
      "Epoch 2/2, Training Loss: 0.3999\n",
      "Epoch 2/2, Training Loss: 0.5475\n",
      "Epoch 2/2, Training Loss: 0.4554\n",
      "Epoch 2/2, Training Loss: 0.4871\n",
      "Epoch 2/2, Training Loss: 0.2960\n",
      "Epoch 2/2, Training Loss: 0.3773\n",
      "Epoch 2/2, Training Loss: 0.3013\n",
      "Epoch 2/2, Training Loss: 0.6053\n",
      "Epoch 2/2, Training Loss: 0.3775\n",
      "Epoch 2/2, Training Loss: 0.5561\n",
      "Epoch 2/2, Training Loss: 0.3713\n",
      "Epoch 2/2, Training Loss: 0.2895\n",
      "Epoch 2/2, Training Loss: 0.3138\n",
      "Epoch 2/2, Training Loss: 0.5803\n",
      "Epoch 2/2, Training Loss: 0.4118\n",
      "Epoch 2/2, Training Loss: 0.4334\n",
      "Epoch 2/2, Training Loss: 0.5214\n",
      "Epoch 2/2, Training Loss: 0.3852\n",
      "Epoch 2/2, Training Loss: 0.6177\n",
      "Epoch 2/2, Training Loss: 0.5353\n",
      "Epoch 2/2, Training Loss: 0.3413\n",
      "Epoch 2/2, Training Loss: 0.4177\n",
      "Epoch 2/2, Training Loss: 0.3238\n",
      "Epoch 2/2, Training Loss: 0.4719\n",
      "Epoch 2/2, Training Loss: 0.5818\n",
      "Epoch 2/2, Training Loss: 0.5135\n",
      "Epoch 2/2, Training Loss: 0.4371\n",
      "Epoch 2/2, Training Loss: 0.8791\n",
      "Epoch 2/2, Training Loss: 0.6011\n",
      "Epoch 2/2, Training Loss: 0.2987\n",
      "Epoch 2/2, Training Loss: 0.3948\n",
      "Epoch 2/2, Training Loss: 0.3856\n",
      "Epoch 2/2, Training Loss: 0.4561\n",
      "Epoch 2/2, Training Loss: 0.3812\n",
      "Epoch 2/2, Training Loss: 0.3600\n",
      "Epoch 2/2, Training Loss: 0.5519\n",
      "Epoch 2/2, Training Loss: 0.4405\n",
      "Epoch 2/2, Training Loss: 0.6971\n",
      "Epoch 2/2, Training Loss: 0.5535\n",
      "Epoch 2/2, Training Loss: 0.5577\n",
      "Epoch 2/2, Training Loss: 0.3892\n",
      "Epoch 2/2, Training Loss: 0.6077\n",
      "Epoch 2/2, Training Loss: 0.3948\n",
      "Epoch 2/2, Training Loss: 0.3263\n",
      "Epoch 2/2, Training Loss: 0.5496\n",
      "Epoch 2/2, Training Loss: 0.5156\n",
      "Epoch 2/2, Training Loss: 0.4201\n",
      "Epoch 2/2, Training Loss: 0.5112\n",
      "Epoch 2/2, Training Loss: 0.5822\n",
      "Epoch 2/2, Training Loss: 0.3477\n",
      "Epoch 2/2, Training Loss: 0.6103\n",
      "Epoch 2/2, Training Loss: 0.3952\n",
      "Epoch 2/2, Training Loss: 0.4169\n",
      "Epoch 2/2, Training Loss: 0.2713\n",
      "Epoch 2/2, Training Loss: 0.3674\n",
      "Epoch 2/2, Training Loss: 0.4138\n",
      "Epoch 2/2, Training Loss: 0.3339\n",
      "Epoch 2/2, Training Loss: 0.4720\n",
      "Epoch 2/2, Training Loss: 0.2473\n",
      "Epoch 2/2, Training Loss: 0.3892\n",
      "Epoch 2/2, Training Loss: 0.4802\n",
      "Epoch 2/2, Training Loss: 0.3974\n",
      "Epoch 2/2, Training Loss: 0.4066\n",
      "Epoch 2/2, Training Loss: 0.3360\n",
      "Epoch 2/2, Training Loss: 0.3663\n",
      "Epoch 2/2, Training Loss: 0.4327\n",
      "Epoch 2/2, Training Loss: 0.4468\n",
      "Epoch 2/2, Training Loss: 0.5070\n",
      "Epoch 2/2, Training Loss: 0.4213\n",
      "Epoch 2/2, Training Loss: 0.4559\n",
      "Epoch 2/2, Training Loss: 0.4821\n",
      "Epoch 2/2, Training Loss: 0.4532\n",
      "Epoch 2/2, Training Loss: 0.2765\n",
      "Epoch 2/2, Training Loss: 0.4011\n",
      "Epoch 2/2, Training Loss: 0.5290\n",
      "Epoch 2/2, Training Loss: 0.3421\n",
      "Epoch 2/2, Training Loss: 0.4540\n",
      "Epoch 2/2, Training Loss: 0.4838\n",
      "Epoch 2/2, Training Loss: 0.4995\n",
      "Epoch 2/2, Training Loss: 0.4234\n",
      "Epoch 2/2, Training Loss: 0.3814\n",
      "Epoch 2/2, Training Loss: 0.3664\n",
      "Epoch 2/2, Training Loss: 0.4320\n",
      "Epoch 2/2, Training Loss: 0.3687\n",
      "Epoch 2/2, Training Loss: 0.6261\n",
      "Epoch 2/2, Training Loss: 0.3209\n",
      "Epoch 2/2, Training Loss: 0.3196\n",
      "Epoch 2/2, Training Loss: 0.4027\n",
      "Epoch 2/2, Training Loss: 0.3986\n",
      "Epoch 2/2, Training Loss: 0.6987\n",
      "Epoch 2/2, Training Loss: 0.5398\n",
      "Epoch 2/2, Training Loss: 0.3382\n",
      "Epoch 2/2, Training Loss: 0.2156\n",
      "Epoch 2/2, Training Loss: 0.4471\n",
      "Epoch 2/2, Training Loss: 0.3695\n",
      "Epoch 2/2, Training Loss: 0.4962\n",
      "Epoch 2/2, Training Loss: 0.3553\n",
      "Epoch 2/2, Training Loss: 0.2896\n",
      "Epoch 2/2, Training Loss: 0.3605\n",
      "Epoch 2/2, Training Loss: 0.4104\n",
      "Epoch 2/2, Training Loss: 0.3563\n",
      "Epoch 2/2, Training Loss: 0.4868\n",
      "Epoch 2/2, Training Loss: 0.7120\n",
      "Epoch 2/2, Training Loss: 0.3918\n",
      "Epoch 2/2, Training Loss: 0.6208\n",
      "Epoch 2/2, Training Loss: 0.6208, Cross-Validation Loss: 0.5447\n"
     ]
    }
   ],
   "source": [
    "# 定义损失函数\n",
    "criterion = nn.CrossEntropyLoss()\n",
    "\n",
    "# 只优化未冻结的参数\n",
    "# optimizer = torch.optim.Adam(filter(lambda p: p.requires_grad, model.parameters()))\n",
    "optimizer = torch.optim.Adam(model.parameters())\n",
    "\n",
    "# 训练模型\n",
    "num_epochs = 2\n",
    "train_losses = []\n",
    "cv_losses = []\n",
    "\n",
    "for epoch in range(num_epochs):\n",
    "    model.train()\n",
    "    for images, labels in trLoader:\n",
    "        optimizer.zero_grad()\n",
    "        outputs = model(images)\n",
    "        loss = criterion(outputs, labels)\n",
    "        loss.backward()\n",
    "        optimizer.step()\n",
    "        \n",
    "        print(f'Epoch {epoch+1}/{num_epochs}, Training Loss: {loss.item():.4f}')\n",
    "        \n",
    "    train_losses.append(loss.item())\n",
    "\n",
    "    # 计算交叉验证损失\n",
    "    model.eval()\n",
    "    cv_loss = 0.0\n",
    "    with torch.no_grad():\n",
    "        for images, labels in cvLoader:\n",
    "            outputs = model(images)\n",
    "            loss = criterion(outputs, labels)\n",
    "            cv_loss += loss.item()\n",
    "    cv_losses.append(cv_loss / len(cvLoader))\n",
    "\n",
    "    print(f'Epoch {epoch+1}/{num_epochs}, Training Loss: {train_losses[-1]:.4f}, Cross-Validation Loss: {cv_losses[-1]:.4f}')\n",
    "\n",
    "# 保存模型\n",
    "torch.save(model.state_dict(), 'mnist_resnet18_finetuned.pth')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "b06955b7-d995-4c7f-887d-abd82afc8ef7",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy on training set: 87.77%\n",
      "Accuracy on cross-validation set: 82.61%\n"
     ]
    },
    {
     "data": {
      "image/png": "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ZUdCSiQSSCSSWrjK+qWoJFStD49CQqY8VDXT1cRUb0eM62YHXYYqIiIiIqJqU9m7aU1NTbi7u+Po0aMYOnSoov3o0aMYPHhwme0NDAxw48YNpbbg4GCEh4djz549cHBwAADk5eWVCVBisRiCIECFc3eoVJFUht8u38P6Y1FIzHwCADApCVXvMFQREREREdUIlb6rnjdvHsaNGwcPDw94enpi06ZNSEhIwLRp0wDIh+slJSVh69atUFNTQ9u2bZX2NzMzg5aWllL7oEGDsHr1anTq1EkxLHDJkiV48803IRaL6/T6VK2wWIa9l+9hw7Eo3HsoD1XN9TTxH28njO1mCx1NhioiIiIiopqi0nfXI0eOREZGBj799FOkpKSgbdu2OHjwIOzs7AAAKSkpSEhIqNIxFy9eDJFIhMWLFyMpKQmmpqYYNGgQPv/889q4hHqpsFiGPZfkoSrpUWmokmCajyPGdrWDtmbTCplERERERHVBpc+5qq8a6nOuCoql2H3xHkIiohWhylRfgmk+ThjTxZahioiIiIioiqqSDTgurBEoKJbi1wuJCImIRnJWPgDATF+C6b2cMLqLLbQ0GKqIiIiIiGobw1UDll8kxa8XExF8LBqp2fJQZW4gwXQfJ4xiqCIiIiIiqlMMVw1QfpEUv5xPQMjxaNzPLgAAWBhoYYavE0Z42DBUERERERGpAMNVA5JfJMXPfydg4/FopOXIQ5WloRZm+DpjhIc1JOoMVUREREREqsJw1QDkF0mxoyRUPSgJVVZG2pjeywlvM1QREREREdULDFf13PZz8QgMjUR67tNQNdPXGcPdraGprvaSvYmIiIiIqK4wXNVzyY+eID23ANbG2pjl64xhnRmqiIiIiIjqI4arem5KT0fYmehgWGdraIgZqoiIiIiI6iuGq3quma4mRr5mq+oyiIiIiIjoJdgVQkREREREVAMYroiIiIiIiGoAwxUREREREVENYLgiIiIiIiKqAQxXRERERERENYDhioiIiIiIqAYwXBEREREREdUAhisiIiIiIqIawHBFRERERERUAxiuiIiIiIiIagDDFRERERERUQ1guCIiIiIiIqoBDFdEREREREQ1gOGKiIiIiIioBqiruoD6SBAEAEB2draKKyEiIiIiIlUqzQSlGeFFGK7KkZOTAwCwsbFRcSVERERERFQf5OTkwNDQ8IXb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",
      "text/plain": [
       "<Figure size 1000x500 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Calculate and print accuracies for training and cross-validation sets\n",
    "model.eval()\n",
    "with torch.no_grad():\n",
    "    # Training set accuracy\n",
    "    tr_correct = 0\n",
    "    tr_total = 0\n",
    "    for images, labels in trLoader:\n",
    "        outputs = model(images)\n",
    "        _, predicted = torch.max(outputs, 1)\n",
    "        _, true_labels = torch.max(labels, 1)\n",
    "        tr_total += labels.size(0)\n",
    "        tr_correct += (predicted == true_labels).sum().item()\n",
    "    \n",
    "    tr_accuracy = 100 * tr_correct / tr_total\n",
    "    \n",
    "    # Test set accuracy\n",
    "    cv_correct = 0\n",
    "    cv_total = 0\n",
    "    for images, labels in cvLoader:\n",
    "        outputs = model(images)\n",
    "        _, predicted = torch.max(outputs, 1)\n",
    "        _, true_labels = torch.max(labels, 1)\n",
    "        cv_total += labels.size(0)\n",
    "        cv_correct += (predicted == true_labels).sum().item()\n",
    "    \n",
    "    cv_accuracy = 100 * cv_correct / cv_total\n",
    "\n",
    "print(f'Accuracy on training set: {tr_accuracy:.2f}%')\n",
    "print(f'Accuracy on cross-validation set: {cv_accuracy:.2f}%')\n",
    "\n",
    "# Plot training and cross-validation losses\n",
    "plt.figure(figsize=(10, 5))\n",
    "plt.plot(range(1, num_epochs+1), train_losses, label='Training Loss')\n",
    "plt.plot(range(1, num_epochs+1), cv_losses, label='Cross-Validation Loss')\n",
    "plt.xlabel('Epoch')\n",
    "plt.ylabel('Loss')\n",
    "plt.title('Training and Cross-Validation Loss')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "55c60826-7fc2-4719-844e-8054bebc980c",
   "metadata": {},
   "outputs": [],
   "source": [
    "model.eval()\n",
    "with torch.no_grad():\n",
    "    test_correct = 0\n",
    "    test_total = 0\n",
    "    for images, labels in teLoader:\n",
    "        outputs = model(images)\n",
    "        _, predicted = torch.max(outputs, 1)\n",
    "        _, true_labels = torch.max(labels, 1)\n",
    "        test_total += labels.size(0)\n",
    "        test_correct += (predicted == true_labels).sum().item()\n",
    "    test_accuracy = 100 * test_correct / test_total\n",
    "    print(f'Accuracy on test set: {test_accuracy:.2f}%')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "7d359e8b-88cd-4f60-8257-578bbfddacdd",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
